home *** CD-ROM | disk | FTP | other *** search
- /*
- * This software is copyright 1992 by Robert Morris.
- * You may freely redistribute this software as shareware
- * if you do so in the same form as you got it. If you find
- * this software useful, please send $12 to:
- * Robert Morris
- * P.O. Box 1044
- * Harvard Square Station
- * Cambridge, MA 02238
- * ecognome@aol.com
- * If you incorporate any of this software in any kind of
- * commercial product, please send $2 per copy distributed
- * to the above address.
- */
-
- /*
- * RTFToField(rtf-text, cardflag, fieldname)
- */
-
- #include <HyperXCmd.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include "SetUpA4.h"
- #include <string.h>
- #include "lists.h"
- #include "rtf.h"
-
- XCmdPtr xptr;
- void error(char *);
- int goterror;
- Handle HStr(char *);
-
- pascal void
- main(paramPtr)
- XCmdPtr paramPtr;
- {
- int i;
- TEHandle teh;
- char fieldname[256];
- Boolean cardFld;
- TEStyleHandle sh1;
- MyStyleHandle sh;
- Handle txt, txt1;
- struct list flds;
- long start, nstart, txtlen;
- OSErr err;
-
- RememberA0();
- SetUpA4();
-
- xptr = paramPtr;
- goterror = 0;
- teh = 0;
- sh = 0;
- sh1 = 0;
- txt = 0;
-
- if(paramPtr->paramCount != 3){
- error("error : usage RTFToField(rtf-text, cardflag, fieldname)\rCopyright 1992 Robert Morris.");
- goto out;
- }
-
- parsertf(paramPtr->params[0], &sh, &txt);
-
- if(goterror)
- goto out;
-
- if(strcmp(*(paramPtr->params[1]), "false") == 0)
- cardFld = FALSE;
- else
- cardFld = TRUE;
-
- start = 0;
- txtlen = GetHandleSize(txt);
- NewList(paramPtr->params[2], &flds);
- while(ReadListLine(&flds, fieldname) != -1){
- CtoPstr(fieldname);
-
- teh = GetFieldTE(paramPtr, cardFld, 0, 0, (StringPtr)fieldname);
- if(teh == 0 || paramPtr->result != xresSucc){
- error("error : no such field");
- goto out;
- }
-
- sh1 = GetStylHandle(teh);
- if(sh1 == 0){
- error("error : GetStylHandle() failed");
- goto out;
- }
-
- nstart = start;
- err = CvtMyStyleHandle(sh, &nstart, sh1, 30000L, txt);
- if(err != 0){
- error("error : out of memory");
- goto out;
- }
-
- /* TESetText() destroys existing style information */
- HLock(txt);
- TESetText(*txt + start, nstart - start, teh);
- HUnlock(txt);
-
- /* so re-compute styles! */
- nstart = start;
- err = CvtMyStyleHandle(sh, &nstart, sh1, 30000L, txt);
-
- SetFieldTE(paramPtr, cardFld, 0, 0, (StringPtr)fieldname, teh);
-
- TEDispose(teh);
- teh = 0;
-
- start = nstart;
- }
-
- out:
- if(sh)
- DisposMyStyleHandle(sh);
- if(teh)
- TEDispose(teh);
- if(txt)
- DisposHandle(txt);
- if(goterror && paramPtr->returnValue == 0)
- paramPtr->returnValue = HStr("error : out of memory!");
- RestoreA4();
- }
-
- Handle
- HStr(str)
- char *str;
- {
- Handle newHndl;
-
- newHndl = (Handle) NewHandle((long) strlen(str) + 1);
- if(newHndl == 0)
- return(0);
- strcpy((char *) (*newHndl), str);
- return(newHndl);
- }
-
- void
- error(s)
- char *s;
- {
- if(goterror == 0)
- xptr->returnValue = HStr(s);
- goterror = 1;
- }